import 'package:dart_serve_study/common/result.dart';
import 'package:dart_serve_study/dart_serve_study.dart';

class ArticleController extends ResourceController {
  ArticleController(this.context);

  final ManagedContext context;

  @Bind.header('token')
  String token; //@Bind 注解可以在局部变量使用，根据传入的key 获取对应的值

  @Operation.get() //获取文章列表
  FutureOr<Response> getArticle() async {
    //查询文章，并根据createDate进行排序
    final query = Query<Article>(context)
      ..sortBy((x) => x.createData, QuerySortOrder.ascending);
    final List<Article> articles = await query.fetch();
    return Result.data(articles);
  }

  @Operation.post() //添加一篇文章
  FutureOr<Response> insertArticle(
      @Bind.body(ignore: ['createData']) Article article) async {
    //这里可以直接转为实体，但是需要注意的是@Bind.body里的参数含义如下
    //ignore表示忽略那些字段
    //reject 表示拒绝接受哪些字段
    //require表示哪些字段必须有
    //啥都不填表示参数如果不传则为空
    article.createData = DateTime.now();
    //插入一条数据
    final result = await context.insertObject<Article>(article);
    return Result.data(result);
  }

  @Operation.get('id') //查询单个文章
  //使用中括号表示参数可选
  Future<Response> getArticleById(@Bind.path('id') int id) async {
    //根据id查询一条数据
    final query = Query<Article>(context)..where((x) => x.id).equalTo(id);
    final article = await query.fetchOne();

    if (article != null) {
      return Result.data(article);
    } else {
      return Result.successMsg();
    }
  }

//修改一篇文章
  @Operation.put()
  Future<Response> updateArticleById(
      @Bind.body(ignore: ['createData']) Article article) async {
    final query = Query<Article>(context)
      ..values.context = article.context
      ..where((x) => x.id).equalTo(article.id);
    //更新一条数据
    final result = await query.updateOne();
    if (result != null) {
      return Result.data(result);
    } else {
      return Result.errorMsg('更新失败，数据不存在');
    }
  }

//删除一篇文章
  @Operation.delete('id') //删除一篇文章
  Future<Response> deleteArticleById(@Bind.path('id') int id) async {
    final query = Query<Article>(context)..where((x) => x.id).equalTo(id);
    //删除一条数据
    final result = await query.delete();
    if (result != null && result == 1) {
      return Result.successMsg('删除成功');
    } else {
      return Result.errorMsg('删除失败，数据不存在');
    }
  }
}
